home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d20 / doorskl3.arc / DOORHELP.C < prev    next >
C/C++ Source or Header  |  1992-01-15  |  4KB  |  200 lines

  1. /*
  2.  * Help functions for doorskel.  Note that these functions are untested in
  3.  * this configuration; they were lifted from XDB (so they do work).
  4.  * these are provided to help you produce slick Doors.
  5.  */
  6.  
  7. #include "doorskel.h"
  8.  
  9. #define MAXHELPS 115
  10. #define YESNOM   15
  11.  
  12. static int hp = 0;
  13. static int ch = 0;
  14. static struct helps {
  15.   char hname[9];
  16.   int  h;
  17.   long hptr;
  18. } hps [MAXHELPS + 1];
  19.  
  20. int  helpfp = -1;
  21. char helpname[MAXDIR];
  22.  
  23. void   _fastcall getline(char *lineh);
  24. char * _fastcall fgetsx (char *str,unsigned int num,unsigned int handle);
  25.  
  26.  
  27. /******************************************
  28.  
  29. help file format:
  30.  
  31. <topic>
  32. help text (may be several lines) for topic
  33. <next topic>
  34. help text for this topic
  35. ...
  36. <end>
  37.  
  38. To use:  call load_help() at program beginning (insert early in mainloop())
  39. Thereafter, use set_help() to establish the current topic and help() to
  40. display help on the current topic.
  41.  
  42. ********************************************/
  43.  
  44.  
  45. /* Load the HELP! definition file */
  46.  
  47. void _fastcall load_help (char *hn) {   /* hn is filename (ex. Door.hlp) */
  48.  
  49.   char lineh[81],*p;
  50.  
  51.  
  52.   if(!strchr(hn,':') && !strchr(hn,'/') && !strchr(hn,'\\')) {
  53.     p = searchpath(hn);
  54.     if(!p) p = hn;
  55.   }
  56.   else p = hn;
  57.  
  58.   if (!strcmp(helpname,p)) return; /* already loaded */
  59.   strcpy(helpname,p);
  60.  
  61.   if((helpfp = sopen(helpname,O_RDONLY | O_BINARY,SH_DENYNO)) == -1) return;
  62.   getline(lineh);
  63.   for(;;) {
  64.     if(hp == MAXHELPS) break;
  65.     if(!strncmp(lineh,"<end>",5)) break;
  66.     if(*lineh != '<') continue;
  67.     strncpy(hps[hp].hname,lineh+1,8);
  68.     hps[hp].hptr = tell(helpfp);
  69.     getline(lineh);
  70.     while (*lineh != '<') {
  71.       hps[hp].h++;
  72.       getline(lineh);
  73.     }
  74.     hp++;
  75.   }
  76.   close(helpfp);
  77. }
  78.  
  79.  
  80. /* Get a line of text from the help file */
  81.  
  82. static void _fastcall getline (char *lineh) {
  83.  
  84.   if(!fgetsx(lineh,80,helpfp)) strcpy(lineh,"<end>");
  85. }
  86.  
  87.  
  88. /* Set the current active help topic */
  89.  
  90. void _fastcall set_help (char *s) {     /* s is name of topic */
  91.  
  92.   for (ch = 0;ch < hp;ch++) if(!strncmp(s,hps[ch].hname,8)) break;
  93. }
  94.  
  95.  
  96. /* Display the current help text */
  97.  
  98. void _fastcall help (void) {
  99.  
  100.   char ln[80];
  101.   int  i,cntr = 0;
  102.  
  103.  
  104.   if((helpfp = sopen(helpname,O_RDONLY | O_TEXT,SH_DENYNO)) == -1) return;
  105.   if (hp && ch != hp) {
  106.     printm("\r\n     -=HELP=-\r\n");
  107.     lseek(helpfp,hps[ch].hptr,0);
  108.     for(i = 0;i < hps[ch].h;i++) {
  109.       getline(ln);
  110.       stripcr(ln);
  111.       rstrip(ln);
  112.       printfm("%s\r\n",ln);
  113.       cntr++;
  114.       if(cntr > numlines - 2) {
  115.         printm("More? (Y/n) ");
  116.         if(*genin(1,0,1,1,YESNOM) != 'N') {
  117.             printm("\b \b \b \b \b \b \b \b \b \b \b \b");
  118.         }
  119.         cntr = 0;
  120.       }
  121.     }
  122.     hitreturn();
  123.   }
  124.   close(helpfp);
  125. }
  126.  
  127.  
  128. /* An fgets() for shared i/o */
  129.  
  130. char * _fastcall fgetsx (char *str,unsigned int num,unsigned int handle) {
  131.  
  132.     char         *p;
  133.     long         pos;
  134.     unsigned int x;
  135.  
  136.  
  137.     if (eof(handle)) {
  138.         *str = 0;
  139.         return NULL;
  140.     }
  141.     pos = tell(handle);
  142.     x = read(handle,str,num - 1);
  143.     if (x < 1) {
  144.         *str = 0;
  145.         return NULL;
  146.     }
  147.     str[x] = 0;
  148.     p = str;
  149.     while(*p && *p != '\r' && *p != '\n') p++;
  150.     if(!*p) return str;
  151.     if(*p == '\r') {
  152.             *p = '\n';
  153.             if (p[1] == '\n') {
  154.                     p++;
  155.                     *p = 0;
  156.             }
  157.     }
  158.     p++;
  159.     *p = 0;
  160.     lseek(handle,pos+((long)p - (long)str),SEEK_SET);
  161.     return str;
  162. }
  163.  
  164.  
  165. #ifdef FFPRINTF
  166.  
  167. #define MAX_BUFFER_LENGTH 641
  168.  
  169. /* An fprintf() for shared i/o
  170.    included this as, together with fgetsx above, it allows you
  171.    to use sopen() and shared/lockable i/o with most of the
  172.    stream conveniences.  ignore this otherwise */
  173.  
  174. unsigned int _cdecl ffprintf (unsigned int handle,char *string,...) {
  175.  
  176.     unsigned int x;
  177.     char *buffer;
  178.     va_list pArguments;
  179.  
  180.  
  181.     buffer = calloc(MAX_BUFFER_LENGTH, sizeof(char));
  182.     if(!buffer) {
  183.         return 0;
  184.     }
  185.  
  186.     va_start(pArguments,string);
  187.       x = vsprintf(buffer,string,pArguments);
  188.     va_end(pArguments);
  189.  
  190.     write(handle,buffer,x);
  191.  
  192.     free(buffer);
  193.  
  194.     return x;
  195. }
  196.  
  197. #endif
  198.  
  199. /* end doorhelp.c */
  200.